<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
    
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
    Git.md |  Small Bridge
  </title>
  <meta name="generator" content="hexo-theme-yilia-plus">
  
  <link rel="shortcut icon" href="/favicon.ico" />
  
  
<link rel="stylesheet" href="/css/main.css">

  
  <script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>
  
  

  

<link rel="alternate" href="/atom.xml" title="Small Bridge" type="application/atom+xml">
</head>

</html>

<body>
  <div id="app">
    <main class="content">
      <section class="outer">
  <article id="post-Git-md" class="article article-type-post" itemscope
  itemprop="blogPost" data-scroll-reveal>

  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  Git.md
</h1>
  

    </header>
    

    
    <div class="article-meta">
      <a href="/2020/05/14/Git-md/" class="article-date">
  <time datetime="2020-05-14T13:10:52.000Z" itemprop="datePublished">2020-05-14</time>
</a>
      
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/">开发工具</a>
  </div>

      
      
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> 字数统计:</span>
            <span class="post-count">4.3k字</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> 阅读时长≈</span>
            <span class="post-count">15分钟</span>
        </span>
    </span>
</div>

      
    </div>
    

    
    
    <div class="tocbot"></div>





    

    
    <div class="article-entry" itemprop="articleBody">
      


      

      
      <p>@<a href="Git简介">TOC</a><br>前言：我不会讲Git的安装，以下的内容都是基于你已经安装好环境了</p>
<a id="more"></a>
<h1 id="Git是什么"><a href="#Git是什么" class="headerlink" title="Git是什么"></a>Git是什么</h1><p>在项目开发的过程中不是一蹴而就的，需要经过不断的修改、增加、删除多个功能模块。每一次改动都是一个版本的迭代，如果这些不同的版本不进行相关的管理的话，会给开发团队带来很大的困难。Git作为一个优秀的版本控制工具，应运而生</p>
<ol>
<li>版本控制工具应该具备的功能:</li>
<li>1 协同修改<br>多人并行不悖的修改服务器端的同一个文件</li>
<li>2 数据备份<br>不仅保存目录和文件的当前状态，还能保存每一个提交过的历史状态</li>
<li>3 版本管理<br>做到不保存重复数据</li>
<li>4 权限控制<br>对团队中参与开发的人员进行权限控制<br>对团队外开发贡献者的代码进行审核</li>
<li>5 历史记录<br>查看修改人、修改时间、修改内容、日志信息<br>将本地文件恢复到某一历史状态</li>
<li>6 分支管理<br>允许开发团队在工作过程中多条生产线同时推进任务，进一步提高效率<h1 id="版本控制简介"><a href="#版本控制简介" class="headerlink" title="版本控制简介"></a>版本控制简介</h1></li>
<li>版本控制是一种思想，它起初于工程设计领域中使用版本控制管理工程蓝图的设计过程，后在IT开发过程中也可以使用版本控制思想管理代码的版本迭代，版本控制思想的实现就是版本控制工具</li>
<li>版本控制工具分为集中式版本控制工具(CVC,SVN,VSS..)和分布式版本控制工具(Git..)，其中分布式版本控制工具能够有效避免单点故障<h1 id="Git的优势"><a href="#Git的优势" class="headerlink" title="Git的优势"></a>Git的优势</h1></li>
<li>大部分操作在本地完成，不需要联网</li>
<li>完整性保证</li>
<li>尽可能添加数据而不是删除和修改数据</li>
<li>分支操作十分快捷流畅</li>
<li>与Linux命令全面兼容</li>
</ol>
<p>所以，会Linux的程序员们用起来更是得心应手，不会问题也不大，我就不会</p>
<h1 id="Git的结构"><a href="#Git的结构" class="headerlink" title="Git的结构"></a>Git的结构</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[工作区] -- git add --&gt; B[暂存区]</span><br><span class="line">B --git commit--&gt; C[本地库]</span><br><span class="line">C --git &#x2F;push&#x2F;pull&#x2F;clone--&gt; D[远程库]</span><br></pre></td></tr></table></figure>
<p>工作区：就是你写代码的地方<br>暂存区：临时存储的地方<br>本地库：本地仓库，里面存储了各个历史版本<br>远程库：代码托管中心的仓库<br>中间的是相关的git命令，后面会一一讲到</p>
<h1 id="Git和GitHub的关系"><a href="#Git和GitHub的关系" class="headerlink" title="Git和GitHub的关系"></a>Git和GitHub的关系</h1><ol>
<li><p>首先需要明确，Git是版本控制工具，GitHub是一个代码托管中心，也就是说你可以通过Git这个工具将自己项目的代码上传到代码托管中心进行托管。代码托管中心并不是唯一的，只不过Git&amp;GitHub这一套体系使用得比较多而已</p>
</li>
<li><p>代码托管中心在局部网环境下，我们可以自己搭建GitLab服务器。在外部网环境下，我可以使用现成的一个国外的GitHub，一个国内的Gitee(码云)，二者区别不大，GitHub会卡一点，你上传的数据在经过太平洋下面的电缆时被淹死了也说不定</p>
</li>
<li><p>无论是哪个代码托管中心，它们的任务都是对远程库进行维护</p>
<h1 id="本地库和远程库的交互方式"><a href="#本地库和远程库的交互方式" class="headerlink" title="本地库和远程库的交互方式"></a>本地库和远程库的交互方式</h1><p>为了方便大家理解，我例出一个场景，后面的例子都是基于这个场景的：<br>话说岳不群正在开发一个华山剑法的项目，无奈他天资欠缺，一个人只完成了些许剑法，这时，他想到了他的徒弟令狐冲，便邀请令狐冲加入自己的团队一同开发</p>
</li>
<li><p>团队内协同开发</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[岳不群的本地库] -- push推送 --&gt; B[远程库]</span><br><span class="line">B--pull被拉取--&gt;A</span><br><span class="line">B --clone克隆--&gt; C[令狐冲的本地库]</span><br><span class="line">C--加入团队后push--&gt;B</span><br></pre></td></tr></table></figure>
<p>这个岳不群又想在剑法中加入葵花宝典，于是给令狐冲下了命令，你你，给我弄出来，可是令狐冲他不会啊，于是他想到了自己的兄弟东方不败，但是东方不败隶属日月神教，无法加入他华山的团队</p>
</li>
</ol>
<p>2.跨团队协作</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[远程库] -- fork --&gt; B[东方不败的远程库]</span><br><span class="line">B --clone克隆--&gt; C[东方不败的本地库]</span><br><span class="line">C--push--&gt;B</span><br><span class="line">B--pull request,岳不群审核通过后--&gt;A</span><br><span class="line">A--pull拉取--&gt;D[岳不群的本地库]</span><br><span class="line">A--pull拉取--&gt;E[令狐冲的本地库]</span><br></pre></td></tr></table></figure>
<h1 id="Git命令行操作"><a href="#Git命令行操作" class="headerlink" title="Git命令行操作"></a>Git命令行操作</h1><p>在描述了交互方式之后就要进入到真正的命令行操作了</p>
<ol>
<li>本地库初始化<br>命令:git init<br>执行命令后，你的项目中会出现一个名称为.git的文件，它默认是隐藏的<br><img src="https://img-blog.csdnimg.cn/20200418172849597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li>
<li>设置签名<br>签名类似设置用户名，就是用来区分不同开发人员的身份的，它分为项目级别和系统用户级别，项目级别仅仅在当前本地仓库范围内有效，系统用户级别登录当前操作系统的用户范围都有效，且项目级别优先于系统用户级别，二者都有，采用项目级别，二者都没有，不好意思，Git不允许，一般使用一个系统用户级别就行了<br>命令<br>项目级别：git config user.name = xxx<pre><code>git config user.email = xxx@xxx.com(不推荐使用网易邮箱，有时候收不到github的邮件)</code></pre>系统用户级别：git config –global user.name = xxx<br>git config –global user.email = <a href="mailto:xxx@xxx.com">xxx@xxx.com</a><br>项目级别的信息保存在当前目录中.git/config文件中，Git Bash中使用cat .git/config可进行查看<br>系统用户的在C:/users/你的电脑名称/.gitconfig文件中可以查看,Git Bash中使用 cd ~,cat .gitconfig </li>
<li>添加提交以及查看状态操作<br>命令: git status 查看状态<br>我在已初始化本地仓库的项目中<br><img src="https://img-blog.csdnimg.cn/20200418175027883.png" alt="在这里插入图片描述"><br>我创建一个txt文件并键入内容退出<br><img src="https://img-blog.csdnimg.cn/20200418175206297.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>添加提交(暂存区)<br><img src="https://img-blog.csdnimg.cn/20200418175307646.png" alt="在这里插入图片描述"><br>可以使用git rm –cached 文件名(从暂存区中撤销)<br>此时再来查看status的状态<br><img src="https://img-blog.csdnimg.cn/20200418175516687.png" alt="在这里插入图片描述"><br>可以很清楚的看到，changes to be commited，我相信大家的英语都比我好，可以提交的改变，可以这样理解吧，那我们提交吧<br><img src="https://img-blog.csdnimg.cn/20200418175805398.png" alt="在这里插入图片描述"><br>git commit -m “这次提交的描述，就是日志信息” 文件名<br>同样可以使用 git commit 文件名这种，但是这样就要进入Vim编辑器，然后在里面编辑日志信息，大家可以自己试一试<br>此时，我们再来查看status<br><img src="https://img-blog.csdnimg.cn/20200418180019433.png" alt="在这里插入图片描述"><br>若我们修改txt文本文件<br><img src="https://img-blog.csdnimg.cn/20200418180302819.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>查看status<br><img src="https://img-blog.csdnimg.cn/20200418180333174.png" alt="在这里插入图片描述"><br>描述很清楚，没有添加到暂存区<br>提交后<br><img src="https://img-blog.csdnimg.cn/20200418180451880.png" alt="在这里插入图片描述"><br>就又跟上面一样了<br>提交到本地库并查看修改<br><img src="https://img-blog.csdnimg.cn/20200418180626534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>小结<br>状态查看操作<br>git status 查看工会区、暂存区的状态<br>添加操作<br>git add 文件名  将工作区的新建/修改添加到暂存区<br>提交操作<br>git commit -m “日志信息” 文件名 将暂存区的内容提交到本地库<h1 id="查看历史记录的几种方式"><a href="#查看历史记录的几种方式" class="headerlink" title="查看历史记录的几种方式"></a>查看历史记录的几种方式</h1>你每提交一次，项目就会更新一个版本，那么如何查看这些更新的版本，我们使用命令git log<br><img src="https://img-blog.csdnimg.cn/20200418181118850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>commit 后面一串是哈希算法生成的，用于区分版本的，在版本前进与后退也有很大作用，作者，日期就不说了，最下面的就是你自己添加的日志信息，但是，这样看起来很复杂，更改一旦多了之后，显示起来很麻烦，还要使用多屏显示，空格退页啊，b翻页啊，所以我们可以使用其他模式查看<br>git log –pretty=oneline 一行显示<br><img src="https://img-blog.csdnimg.cn/20200418181605553.png" alt="在这里插入图片描述"><br>git log –oneline 简洁一行显示<br><img src="https://img-blog.csdnimg.cn/20200418181636332.png" alt="在这里插入图片描述"><br>git reflog 指明了指针移动的次数<br><img src="https://img-blog.csdnimg.cn/20200418181722205.png" alt="在这里插入图片描述"><br>HEAD@{2} 意思就是到这个版本，指针需要移动2次<h1 id="版本前进与后退的方式"><a href="#版本前进与后退的方式" class="headerlink" title="版本前进与后退的方式"></a>版本前进与后退的方式</h1>在项目开发中，情况是瞬息万变的，可能刚刚提交的功能，下一秒就要删除这个功能，重新定义代码，<br>Git中支持的版本前进与后退就很好的满足了这个需求<br>文本文档中最后的一行是我在第二次提交是更改了，现在我不要了，我要回到只有前两行文字的时候<br><img src="https://img-blog.csdnimg.cn/20200418182135801.png" alt="在这里插入图片描述"><br>我们使用 git reflog查看<br><img src="https://img-blog.csdnimg.cn/20200418182316745.png" alt="在这里插入图片描述"><br>我们可以看到，当前的版本是1eb2056,添加的日志信息是change something(所以日志很重要),我们想要最后一行文字消失，只要版本回到del4f28版本也就是第一次提交的版本就行了<br>为此，我们使用命令: git reset –hard 索引值<br><img src="https://img-blog.csdnimg.cn/20200418182720994.png" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200418182759940.png" alt="在这里插入图片描述"><br>我们还可以使用^和<del>符号来进行版本的更替，但是只能后退版本<br>git reset –hard HEAD^ 表示后退一个版本<br>git reset –hard HEAD^^ 表示后退两个版本<br>git reset –hard HEAD</del>3 表示后退3个版本</li>
</ol>
<p>我们不止可以使用hard参数，还可以使用soft和mixed，它们的区别在于：<br>–soft 仅仅在本地库移动HEAD指针<br>–mixed 在本地库移动指针，重置暂存区<br>–hard 在本地库移动指针，重置暂存区和工作区<br>常用hard<br>你可以使用git help reset 查看文档获得更多信息，我就不贴图了，全英文，头疼</p>
<h1 id="删除文件找回"><a href="#删除文件找回" class="headerlink" title="删除文件找回"></a>删除文件找回</h1><p>删除文件找回的原理也是版本的更替，因为git中任何一条记录都不可磨灭，所以只要回到文件没被删除的版本即可恢复被删除的文件</p>
<ol>
<li>提交到本地库之后删除了<br>创建文本文件，提交到本地库<br><img src="https://img-blog.csdnimg.cn/20200418185250189.png" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200418185910976.png" alt="在这里插入图片描述"><br>删除文件<br><img src="https://img-blog.csdnimg.cn/20200418185342639.png" alt="在这里插入图片描述"><br>查看状态，红色文字说明为提交的更改，就是记录(版本)没有生成<br><img src="https://img-blog.csdnimg.cn/20200418185355454.png" alt="在这里插入图片描述"><br>提交到暂存区，绿字说明要提交的更改<br><img src="https://img-blog.csdnimg.cn/20200418185552214.png" alt="在这里插入图片描述"><br>记录已经生成了，我们可以回退了<br><img src="https://img-blog.csdnimg.cn/20200418185655211.png" alt="在这里插入图片描述"><br>回退过去，删除文件就恢复了<br><img src="https://img-blog.csdnimg.cn/20200418185834687.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li>
<li>添加到暂存区之后删除了<br>就是执行了rm 文件名 移除文件后，执行git add 文件名，但是没有执行git commit提交到本地库,此时直接使用git reset –hard HEAD就可恢复l ,图我就不截了，太重复了，可以自行测试</li>
</ol>
<p>小结<br>前提：删除前，文件存在时的状态提交了<br>操作：git reset –hard [历史版本索引]<br>删除操作已经提交到本地库：指针指向历史记录<br>删除操作提交到了暂存区：指针位置用HEAD</p>
<h1 id="比较文件"><a href="#比较文件" class="headerlink" title="比较文件"></a>比较文件</h1><p>使用git diff命令<br>git diff [文件名] 将工作区的文件和暂存区的文件进行比较<br><img src="https://img-blog.csdnimg.cn/20200418190707193.png" alt="在这里插入图片描述"><br>git diff [本地库历史版本索引] [文件名] 将工作区的文件和本地库的某一历史版本比较<br>索引使用git reflog查看，别忘了<br><img src="https://img-blog.csdnimg.cn/20200418190911250.png" alt="在这里插入图片描述"><br>git diff 多个文件比较<br><img src="https://img-blog.csdnimg.cn/20200418191018159.png" alt="在这里插入图片描述"></p>
<h1 id="分支管理"><a href="#分支管理" class="headerlink" title="分支管理"></a>分支管理</h1><ol>
<li><p>什么是分支<br>在版本控制过程中，使用多条线同时推进多个任务</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[master1.0] -- 版本前进 --&gt; B[版本2.0]</span><br><span class="line">B--bug--&gt;E[修复分支hot_fix]</span><br><span class="line">E--&gt;C</span><br><span class="line">B--版本前进--&gt;C[版本3.0]</span><br><span class="line">C--版本前进--&gt;D[版本4.0]</span><br><span class="line">A--clone--&gt;F[新功能A]</span><br><span class="line">F--开发完成--&gt;G[完成新功能]</span><br><span class="line">G--合并--&gt;B</span><br><span class="line">H[新功能B]--clone--&gt;A</span><br><span class="line">H--推进--&gt;I[继续完善]</span><br><span class="line">I--完成--&gt;J[完成功能]</span><br><span class="line">J--合并--&gt;D</span><br></pre></td></tr></table></figure></li>
<li><p>分支的好处<br>并行推进多个功能的开发，提高效率<br>各个分支在开发过程中，相互独立，互不影响，如果某一个分支开发失败，直接删除此分支重新开发即可</p>
</li>
<li><p>分支操作<br>git branch -v 查看当前所有分支<br><img src="https://img-blog.csdnimg.cn/2020041819321029.png" alt="在这里插入图片描述"><br>git branch [名称] 创建某个分支<br><img src="https://img-blog.csdnimg.cn/20200418193305663.png" alt="在这里插入图片描述"><br>git checkout [分支名称] 切换到某个分支<br><img src="https://img-blog.csdnimg.cn/20200418193337792.png" alt="在这里插入图片描述"><br>在接受分支修改的分支上，执行<br>git merge 另一个分支名 合并分支，增加内容的修改<br><img src="https://img-blog.csdnimg.cn/20200418193702798.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/2020041819372948.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
</li>
<li><p>解决合并分支中产生的冲突<br>原因：两个分支(或多个)修改相同位置，但修改的内容却不同，合并的时候，Git拿不定注意，产生冲突<br>在master分支上修改第3行<br><img src="https://img-blog.csdnimg.cn/20200418194131726.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>提交到本地库<br><img src="https://img-blog.csdnimg.cn/2020041819444394.png" alt="在这里插入图片描述"><br>在hot_you分支上也修改第三行<br><img src="https://img-blog.csdnimg.cn/20200418194413528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>提交到本地库<br><img src="https://img-blog.csdnimg.cn/20200418194735111.png" alt="在这里插入图片描述"><br>合并分支，产生冲突<br><img src="https://img-blog.csdnimg.cn/20200418194816902.png" alt="在这里插入图片描述"><br>这里显示正在合并，因为Git拿不定主意，所以需要手动操作<br>首先,vim 进入,可以看到冲突的表现，一些奇怪的符号<br><img src="https://img-blog.csdnimg.cn/20200418194946106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>接下来调整文档，调整成你需要的效果，正经开发时，可能应该和另一个团员商议更改<br><img src="https://img-blog.csdnimg.cn/20200418195135949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>保存退出<br>然后<br><img src="https://img-blog.csdnimg.cn/20200418195247869.png" alt="在这里插入图片描述"><br>我们可以看到，已经退出合并了，说明合并冲突解决了，注意这个git commit 后面不能加文件名<br>成功<br><img src="https://img-blog.csdnimg.cn/20200418195417839.png" alt="在这里插入图片描述"></p>
<h1 id="Git原理"><a href="#Git原理" class="headerlink" title="Git原理"></a>Git原理</h1></li>
<li><p>哈希<br>哈希是一个系列的加密算法，各个不同的哈希算法虽然加密强度不同，但是有几个特点：<br>a. 不管输入数据的数据量有多大，输入同一个哈希算法，得到的加密结果长度固定<br>b. 哈希算法确定，输入数据确定，输出数据能够保证不变<br>c. 哈希算法确定，输入数据有变化，输出数据一定有变化，而且通常变化很大<br>d. 哈希算法不可逆<br>Git底层采用的是SHA-1算法(哈希的一种)</p>
</li>
<li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[原始文件] -- SHA-1 --&gt; B[Hash值]</span><br><span class="line">A --网络传输--&gt;C[目标文件] </span><br><span class="line">C--SHA-1--&gt;D[Hash值]</span><br><span class="line">B--比对--&gt;D</span><br><span class="line">D--不一致--&gt;目标文件损坏</span><br></pre></td></tr></table></figure>
<p>Git就是靠这种机制来从根本上保证数据完整性的</p>
</li>
<li><p>Git的文件管理机制<br>Git把数据看做是小型文件系统的一组快照，每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引，为了高效，如果文件没有修改，Git不再重新存储该文件，而是只保留一个链接指向之前存储的文件，所以Git的工作方式可以称之为快照流</p>
</li>
<li><p>Git文件管理机制细节<br>Git的提交对象</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[98ca9 commit size tree 92ec2] --&gt; B[92ec2 tree size blob 5b1d3 blob 911e7 blob cba8a]</span><br><span class="line">B--&gt;C[5b1d3 blob size]</span><br><span class="line">B--&gt;D[911e7 blob size]</span><br><span class="line">B--&gt;E[cba8a blob size]</span><br></pre></td></tr></table></figure>
<p>提交对象及其父对象形成链条</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[98ca9 commit size tree 92ec2] --&gt; B[34ac2 commit size parent 98ac9 tree ...]</span><br><span class="line">B--&gt;C[f30ab commit size parent 34ac2 tree...]</span><br></pre></td></tr></table></figure></li>
<li><p>Git分支管理机制<br>分支的创建就是新建一个指针指向master指针指向的内容<br>分支的切换实际上就是变换HEAD的指向<br>版本的更替就是指针的移动</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[98ca9] --&gt; B[34ac2]</span><br><span class="line">B--&gt;C[f30ab ]</span><br><span class="line">D[master]--&gt;C</span><br><span class="line">E[HEAD]--&gt;D</span><br></pre></td></tr></table></figure>
<h1 id="GitHub远程库操作"><a href="#GitHub远程库操作" class="headerlink" title="GitHub远程库操作"></a>GitHub远程库操作</h1><p>我就不截图演示了，GitHub卡，自行测试吧<br>要使用GitHub，首先你要注册一个GitHub的账号，这个，自己去注册就行了，我就说一说本地库与远程库的连接</p>
</li>
<li><p>默认本地库已经初始化完成</p>
</li>
<li><p>GitHub上创建对应的远程库，名称自拟</p>
</li>
<li><p>执行git remote add origin [GitHub仓库地址]  这步相当于给仓库地址取了一个别名叫origin</p>
</li>
<li><p>使用 git remote -v 查看当前别名</p>
</li>
<li><p>推送到远程仓库 git push [仓库地址] [分支名]<br>git oush origin master</p>
</li>
<li><p>克隆操作 git clone [远程仓库地址]<br>执行这一步相当于：<br>a. 完整的把远程库下载到本地<br>b. 创建了origin远程地址别名<br>c. 初始化了本地库</p>
</li>
<li><p>邀请某人加入团队(GitHub上操作即可，没什么说的)</p>
</li>
<li><p>远程库修改的拉取<br>git fetch origin master<br>git merge origin/master<br>或者直接执行<br>git pull origin master</p>
</li>
<li><p>协同开发时冲突的解决<br>两个人修改了同一部分的代码，且一人先提交，导致后一个人提交的时候失败，发生冲突，这时，应该先拉取(git pull origin master),后面按照解决一般冲突的方法解决就行了  </p>
<h1 id="SSH免密登录"><a href="#SSH免密登录" class="headerlink" title="SSH免密登录"></a>SSH免密登录</h1><p>在执行推送到远程库的时候，需要输入自己GitHub的用户名和密码，这样有点不方便，我们可以使用SSH密钥来实现免密登录</p>
</li>
<li><p>进入当前用户的家目录(Git Bash中)<br>cd ~</p>
</li>
<li><p>删除.ssh目录<br>rm -r .ssh/</p>
</li>
<li><p>生成ssh<br>ssh-keygen -t -C &lt;你登录GitHub的邮箱&gt;<br>若干回车</p>
</li>
<li><p>进入ssh目录<br>cd .ssh/</p>
</li>
<li><p>查看id_rsa.pub<br>cat id_rsa.pub<br>复制里面的内容</p>
</li>
<li><p>GitHub上<br><img src="https://img-blog.csdnimg.cn/20200418211631843.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
</li>
<li><p>添加SSH密钥别名<br>git remote add origin_ssh &lt;ssh的地址&gt;<br><img src="https://img-blog.csdnimg.cn/20200418211905675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI1MTQy,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>git remote -v 查看是否成功添加<br>然后你执行推送的时候使用 git push origin_ssh master 就可以不用输入账号密码了<br>本文总结自尚硅谷的Git教程，想看完整视频学习的，B站搜索绯色之村，我的收藏里，Git教程可以观看<br>我的分享就到这里了，谢谢大家</p>
</li>
</ol>

      
      <!-- reward -->
      
      <div id="reward-btn">
        打赏
      </div>
      
    </div>
    
    
      <!-- copyright -->
      
        <div class="declare">
          <ul class="post-copyright">
            <li>
              <i class="ri-copyright-line"></i>
              <strong>版权声明： </strong s>
              本博客所有文章除特别声明外，均采用 <a href="https://www.apache.org/licenses/LICENSE-2.0.html" rel="external nofollow"
                target="_blank">Apache License 2.0</a> 许可协议。转载请注明出处！
            </li>
          </ul>
        </div>
        
    <footer class="article-footer">
      
          
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=https://lockme.gitee.io/2020/05/14/Git-md/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/" rel="tag">版本控制</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7/" rel="tag">项目构建工具</a></li></ul>


    </footer>

  </div>

  
  
  <nav class="article-nav">
    
      <a href="/2020/05/14/CSS3-one-md/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            CSS3_one.md
          
        </div>
      </a>
    
    
      <a href="/2020/05/14/Es6-two-md/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">Es6_two.md</div>
      </a>
    
  </nav>


  

  
  
<!-- valine评论 -->
<div id="vcomments-box">
    <div id="vcomments">
    </div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src='https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>
<script>
    new Valine({
        el: '#vcomments',
        app_id: 'pmaQYnbUE9O0H1hiYKLiec4R-gzGzoHsz',
        app_key: 'LMujtI79W4vgEQ3Az5IMo50y',
        path: window.location.pathname,
        notify: 'false',
        verify: 'false',
        avatar: 'mp',
        placeholder: '给我的文章加点评论吧~',
        recordIP: true
    });
    const infoEle = document.querySelector('#vcomments .info');
    if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
        infoEle.childNodes.forEach(function (item) {
            item.parentNode.removeChild(item);
        });
    }
</script>
<style>
    #vcomments-box {
        padding: 5px 30px;
    }

    @media screen and (max-width: 800px) {
        #vcomments-box {
            padding: 5px 0px;
        }
    }

    #vcomments-box #vcomments {
        background-color: #fff;
    }

    .v .vlist .vcard .vh {
        padding-right: 20px;
    }

    .v .vlist .vcard {
        padding-left: 10px;
    }
</style>

  

  
  
  

</article>
</section>
      <footer class="footer">
  <div class="outer">
    <ul class="list-inline">
      <li>
        &copy;
        2020
        月下ctrlc
      </li>
      <li>
        
        Powered by
        
        
        <a href="https://hexo.io" target="_blank">Hexo</a> Theme <a href="https://github.com/Shen-Yu/hexo-theme-ayer" target="_blank">Ayer</a>
        
      </li>
    </ul>
    <ul class="list-inline">
      <li>
        
        
        <span>
  <i>PV:<span id="busuanzi_value_page_pv"></span></i>
  <i>UV:<span id="busuanzi_value_site_uv"></span></i>
</span>
        
      </li>
      
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>
      <div class="to_top">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>
      </div>
    </main>
    <aside class="sidebar">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/avatar.jpg" alt="Small Bridge"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/Vue/">Vue</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="http://shenyu-vip.lofter.com" target="_blank" rel="noopener">主题作者相册</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/2020/03/18/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>拿钱砸死我吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/images/alipay.png">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/images/wechat.png">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/js/jquery-2.0.3.min.js"></script>


<script src="/js/share.js"></script>


<script src="/js/lazyload.min.js"></script>


<script>
  try {
    var typed = new Typed("#subtitle", {
      strings: ['面朝大海，春暖花开', '愿你一生努力，一生被爱', '想要的都拥有，得不到的都释怀'],
      startDelay: 0,
      typeSpeed: 200,
      loop: true,
      backSpeed: 100,
      showCursor: true
    });
  } catch (err) {
  }

</script>




<script src="/js/tocbot.min.js"></script>

<script>
  // Tocbot_v4.7.0  http://tscanlin.github.io/tocbot/
  tocbot.init({
    tocSelector: '.tocbot',
    contentSelector: '.article-entry',
    headingSelector: 'h1, h2, h3, h4, h5, h6',
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer: 'main',
    positionFixedSelector: '.tocbot',
    positionFixedClass: 'is-position-fixed',
    fixedSidebarOffset: 'auto',
    onClick: (e) => {
      $('.toc-link').removeClass('is-active-link');
      $(`a[href=${e.target.hash}]`).addClass('is-active-link');
      $(e.target.hash).scrollIntoView();
      return false;
    }
  });
</script>



<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">
<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js"></script>

<script src="/js/ayer.js"></script>



<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>


<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
      tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
  });

  MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for(i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
      }
  });
</script>

<script src="https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script>
  var ayerConfig = {
    mathjax: true
  }
</script>



<script src="/js/busuanzi-2.3.pure.min.js"></script>



<script type="text/javascript" src="https://js.users.51.la/20544303.js"></script>


    
  </div>
</body>

</html>